package pl.smath.operation.basic;

import java.util.List;

import pl.smath.expression.MultiTerm;
import pl.smath.expression.Term;



/**
 * Klasa bazowa dla wszystkich operacji
 * 
 * @author klangner
 *
 */
public abstract class Operation {
	
	/**
	 * Obsługa operacji 2 parametrowych
	 */
	public Term process(Term t1, Term t2){
		return null;
	}
	
	
	/**
	 * funkcja ta upraszcza wielomian poprzez próbe dodania do siebie wszystkich podobnych składników.
	 * Operacja ta nie upraszcza nawiasów. 
	 * Czyli podwyrazenia typu SumTerm nie sa rozwijane i nie sa dodawane
	 * 
	 * @param term
	 * @return Nowy obiekt lub null jezeli nic nie zostalo dodane
	 */
	public Term processAll(MultiTerm inputTerm){
		List<Term>	terms = inputTerm.getTermsList();
		Term outputTerm = inputTerm;
		
		// Dodajemy tylko gdy ilość elementów > 1
		if(terms.size() <= 1)
			return inputTerm;
		
		// Looks for terms which could be added
		int count = terms.size();
		for(int i = 0; i < terms.size(); i++){
			
			Term term = terms.get(i);
			
			for(int j = i+1; j < terms.size(); ){
				Term newTerm = process(term, terms.get(j)); 
				if( newTerm != null){
					term = newTerm;
					terms.set(i, newTerm);
					terms.remove(j);
				}
				else{
					j++;
				}
			}
		}
		
		// Sprawdzenie czy dodalismy jakies wyrazenia
		if(count > terms.size()){
			return mergeTerms(terms);
		}

		return outputTerm;
	}

	
	/**
	 * Zamiana listy podwyrazen na wyrazenia. Implementacja zalezy od operacji
	 * @param terms
	 * @return
	 */
	protected Term mergeTerms(List<Term> terms){
		return null;
	}
}
